package model.dominio;

import java.io.Serializable;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Calendar;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.PostPersist;
import javax.persistence.PostUpdate;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import model.dao.DaoBase;

/**
 * 
 * @author Daniel
 * Classe responsável pelo controle dos objetos referentes aos Usuários do Sistema.
 * Mapeamento utilizando Hibernate feito abaixo:
 */
@Entity
@Table(name = "usuario")
public class Usuario implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, nullable = false)
    private Integer codigo;
    @Column(length = 100)
    private String nome;
    @Column(length = 25, unique = true)
    private String login;
    @Column(length = 255)
    private String senha;
    @Column(length = 14)
    private String cpf;
    @JoinColumn(name = "perfil", referencedColumnName = "codigo")
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    private PerfilUsuario perfil;
    @Temporal(TemporalType.TIMESTAMP)
    private Calendar data_ultima_alteracao;
    @JoinColumn(name = "codigo_usuario", referencedColumnName = "codigo")
    @ManyToOne(optional = true, fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    private Usuario usuario;

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @return the login
     */
    public String getLogin() {
        return login;
    }

    /**
     * @param login the login to set
     */
    public void setLogin(String login) {
        this.login = login;
    }

    /**
     * @return the senha
     */
    public String getSenha() {
        return senha;
    }

    /**
     * @param senha the senha to set
     */
    public void setSenha(String senha) {

        MessageDigest md;
        try {
            md = MessageDigest.getInstance("MD5");
            BigInteger hash = new BigInteger(1, md.digest(senha.getBytes()));
            this.senha = hash.toString(16);
            System.out.println(this.senha);
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        }

    }

    /**
     * @return the perfil
     */
    public PerfilUsuario getPerfil() {
        return perfil;
    }

    /**
     * @param perfil the perfil to set
     */
    public void setPerfil(PerfilUsuario perfil) {
        this.perfil = perfil;
    }

    /**
     * @return the cpf
     */
    public String getCpf() {
        return cpf;
    }

    /**
     * @param cpf the cpf to set
     */
    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    /**
     * @return the codigo
     */
    public Integer getCodigo() {
        return codigo;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public Calendar getData_ultima_alteracao() {
        return data_ultima_alteracao;
    }

    public void setUsuario(Usuario usuarioLogado) {
        this.usuario = usuarioLogado;
    }

    public void setData_ultima_alteracao(Calendar data) {
        this.data_ultima_alteracao = data;
    }

    @PostPersist
    public void gerarLogCad() {
        Logg logg = new Logg();
        logg.setCodigo_objeto(this.codigo);
        logg.setAcao(new AcaoSistema(3));
        logg.setData_hora(this.data_ultima_alteracao);
        logg.setUsuario(this.usuario);
        new DaoBase().salvar(logg);
    }

    @PostUpdate
    public void gerarLogAlt() {
        Logg logg = new Logg();
        logg.setCodigo_objeto(this.codigo);
        logg.setAcao(new AcaoSistema(4));
        logg.setData_hora(this.data_ultima_alteracao);
        logg.setUsuario(this.usuario);
        new DaoBase().salvar(logg);
    }

    @Override
    public String toString() {
        return this.nome;
    }
}
